#pragma once

#include<unordered_map>
#include<functional>
#include<mymuduo/TcpConnection.h>
#include<mutex>

#include"json.hpp"
#include"redis/redis.hpp"

using namespace std;
using namespace placeholders;

using json = nlohmann::json;
using MsgHandler = std::function<void(const TcpConnectionPtr&, json&, Timestamp&)>;

//服务器业务类
class ChatService{
public:
    //单例接口
    static ChatService* instance();

    //处理登录和注册业务
    void login(const TcpConnectionPtr&, json&, Timestamp&);
    void reg(const TcpConnectionPtr&, json&, Timestamp&);

    //处理聊天业务
    void singleChat(const TcpConnectionPtr&, json&, Timestamp&);

    //添加好友的业务
    void addFriend(const TcpConnectionPtr&, json&, Timestamp&);

    //处理客户端异常断开
    void onErrorDisconnect(const TcpConnectionPtr&);

    //服务器异常结束，重置数据库状态信息
    void reset();

    //创建群组业务
    void createGroup(const TcpConnectionPtr&, json&, Timestamp&);

    //加入群组业务
    void addGroup(const TcpConnectionPtr&, json&, Timestamp&);

    //群组聊天业务
    void groupChat(const TcpConnectionPtr&, json&, Timestamp&);

    //获取消息对应的Handler
    MsgHandler getHandler(int);

    //从redis获得消息的回调函数
    void redisReadHandler(int, string);    

private:
    //禁止类外构造
    ChatService();

    //存储在线用户id和对应的TcpConnectionPtr的map
    unordered_map<int,TcpConnectionPtr> _onlineUserConnectionMap;
    //提供给_onlineUserConnectionMap使用的互斥锁
    mutex _Mutex;

    //存储消息ID和其事件对应的回调函数
    unordered_map<int, MsgHandler> _msgHandlerMap;
    //唯一单例的指针
    static ChatService* _service;

    //redis服务
    Redis _redis;
};